#ifndef RPI_H
#define RPI_H

#include "bcm2835.h"
#include <string>

#define RPI_03 RPI_GPIO_P1_03 // SDA
#define RPI_04 RPI_GPIO_P1_05 // SCL
#define RPI_06 RPI_GPIO_P1_07 // free
#define RPI_07 RPI_GPIO_P1_08 // free
#define RPI_08 RPI_GPIO_P1_10 // free
#define RPI_09 RPI_GPIO_P1_11 // free
#define RPI_10 RPI_GPIO_P1_12 // free
#define RPI_11 RPI_GPIO_P1_13 // free
#define RPI_12 RPI_GPIO_P1_15 // adc data
#define RPI_13 RPI_GPIO_P1_16 // (us pwr switch)
#define RPI_14 RPI_GPIO_P1_18 // us buf 0
#define RPI_15 RPI_GPIO_P1_19 // us buf 1
#define RPI_16 RPI_GPIO_P1_21 // us buf 2
#define RPI_17 RPI_GPIO_P1_22 // us buf 3
#define RPI_18 RPI_GPIO_P1_23 // us buf 4
#define RPI_19 RPI_GPIO_P1_24 // us buf 5
#define RPI_20 RPI_GPIO_P1_26 // us trig



class RPi
{
  public:
    enum InterruptTrigger { Rising, Falling, Both, None};
    enum PinLevel { High, Low };

    static RPi* getInstance();
    static void initialize();
    static void finalize();
    static long sec();
    static long usec();
    static long msec();


    static int i2cFile();

    static void setupInterrupt(int pinno, InterruptTrigger it);
    static void setupOutput(int pin);
    static void setupInput(int pin);

    static void writeOutput(int pin, PinLevel po);
    static PinLevel readInput(int pin);
    static int  pollInterrupt(int pinint, int timeout);

  
    static bool hasOption(const std::string &opt);


  private:
    long time_sec, time_usec;
    static int  m_file;
    static int  pinfile[30];
    static RPi* m_instance;

};

#endif
